package initialize

import (
	"fmt"
	"k8soperation/global"
	"k8soperation/internal/pkg/logger"
	"os"
	"path/filepath"
)

// SetupLogger 用于初始化和配置应用程序的日志记录器
// 它会检查配置、创建日志目录，并设置日志选项
// 返回 error 以指示初始化过程中是否出现错误
// SetupLogger 用于初始化和配置应用程序的日志记录器
// 它会检查应用设置、创建日志目录、设置日志级别并配置日志记录器选项
// 返回值:
//   - error: 如果在初始化过程中发生错误，则返回相应的错误信息
func SetupLogger() error {
	// 检查全局应用设置是否已初始化
	if global.AppSetting == nil {
		return fmt.Errorf("AppSetting is nil")
	}

	// 确保日志目录存在
	// 从日志文件名中提取目录路径
	logPath := filepath.Dir(global.AppSetting.LogFileName)
	// 检查目录是否存在，如果不存在则创建
	if _, err := os.Stat(logPath); os.IsNotExist(err) {
		// 创建目录及其所有必要的父目录，权限设置为 0755
		if err := os.MkdirAll(logPath, 0755); err != nil {
			return fmt.Errorf("failed to create log directory: %w", err)
		}
	}

	// 设置日志级别
	level := logger.WithLevel(global.AppSetting.LogLevel)
	// 配置日志记录器的选项
	options := []logger.Option{
		logger.AddCaller(),      // 添加调用者信息
		logger.AddCallerSkip(1), // 如果 caller 还指到封装层，可以改成 2
		logger.AddStacktrace(logger.ErrorLevel),
	}

	// 关键修改：不再 OpenFile；只用 lumberjack + Stdout（在 NewLogger 里）
	global.Logger = logger.NewLogger(
		level,
		logger.RotateOptions{
			FileName:   global.AppSetting.LogFileName,
			MaxSize:    global.AppSetting.LogMaxSize,
			MaxBackups: global.AppSetting.LogMaxBackup,
			MaxAge:     global.AppSetting.LogMaxAge,
			Compress:   global.AppSetting.LogCompress,
		},
		options...,
	)

	return nil
}
